/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package station;

import java.util.Collections;
import java.util.LinkedList;

/**
 *
 * @author safe
 */
public final class DataSlotBelegung {

    public static final int ANZAHL_SLOTS = 25;
    //   private static ArrayList<Boolean> slotBelegung = new ArrayList<Boolean>();
    private static LinkedList<Integer> slotBelegung = new LinkedList<Integer>();
    private static int ourNextSlot = -1;
    private static int ourCurrentSlot = -1;

    private static boolean esGibtFreieSlots(int anzahlFreierSlots) {
        return anzahlFreierSlots > 0;
    }
    
    static synchronized void shiftSlotsFrameEnd(){
        ourCurrentSlot = ourNextSlot;
        ourNextSlot = -1;
    }

    static synchronized boolean istSlotFrei(int i) {
        return slotBelegung.contains(i);
    }

    private DataSlotBelegung() {
    }

    public static synchronized int getOurNextSlot() {
        return ourNextSlot;
    }
    
     public static synchronized int getOurCurrentSlot() {
        return ourCurrentSlot;
    }

//    synchronized static void calculateNextFreeSlot() {
//        // alle leeren slots zählen und array zu initialisieren
//        ArrayList<Integer> freieSlots = new ArrayList<Integer>();
//        for (int i = 0; i < ANZAHL_SLOTS; i++) {
//            if (istSlotFrei(i)) {
//                freieSlots.add(i);
//            }
//        }
//        int anzahlFreierSlots = freieSlots.size();
//        if (esGibtFreieSlots(anzahlFreierSlots)) {
//            ourNextSlot = freieSlots.get(new Random().nextInt(anzahlFreierSlots));
//
////            if (!istSlotFrei(ourNextSlot)) {
////                throw new ArithmeticException("falscher slot berechnet");
////            }
//        } else {
//            System.out.println("Keine freien Slots, warte einen Frame.");
//            ourNextSlot = -1;
//        }
//
//    }
    synchronized static void calculateNextFreeSlot() {

        if (slotBelegung.size() > 0) {
            ourNextSlot = slotBelegung.getFirst();
        } else {
            System.out.println("Keine freien Slots, warte einen Frame.");
            ourNextSlot = -1;
        }
    }
    
    
      synchronized static void calculateCurrentFreeSlot() {

        if (slotBelegung.size() > 0) {
            ourCurrentSlot = slotBelegung.getFirst();
        } else {
            System.out.println("Keine freien Slots, warte einen Frame.");
            ourCurrentSlot = -1;
        }
    }
    
    
    
    


    static synchronized void setSlotReserved(int slotNumber) {
        if (slotNumber >= 0 && slotNumber < 25) {
            int index = slotBelegung.indexOf(slotNumber);
            if (index != -1) {
                slotBelegung.remove(index);
            } else {
//                System.out.println("Doppelreservierung augetreten");
            }
//        } else {
//            throw new IllegalArgumentException("Slot " + slotNumber + " gibts nicht.");
       }
    }

    static synchronized void setSlotFree(int slotNumber) {
        if (slotNumber >= 0 && slotNumber < 25) {
            slotBelegung.add(slotNumber);
//        }else if(slotBelegung.contains(new Integer(slotNumber))){
//            System.out.println("Der Slot war schon frei");
//        }else {
//            throw new IllegalArgumentException("Slot " + slotNumber + " gibts nicht.");
        }
    }

//    static synchronized void setAllToFalse() {
//        for (int i = 0; i < 25; i++) {
//            slotBelegung.set(i, Boolean.FALSE);
//        }
//    }
    static synchronized void setAllToFalse() {
        slotBelegung.clear();
        initializeSlots();
    }

//    static synchronized void initializeSlots() {
//        for (int i = 0; i < 25; i++) {
//            slotBelegung.add(Boolean.FALSE);
//        }
//    }
    static synchronized void initializeSlots() {
        for (int i = 0; i < 25; i++) {
            slotBelegung.add(i);
        }
        Collections.shuffle(slotBelegung);
    }

    public static synchronized void disableNextSlot() {
        ourNextSlot = -1;
    }
}
